package com.example.controller;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.example.entity.Order;
import com.example.service.OrderService;
import com.example.util.PayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.util.Map;

/**
 * 支付宝支付控制器，处理与支付宝支付相关的请求
 */
@Controller
@RequestMapping("/api/alipay")
public class AliPayController {
    // 自动注入订单服务
    @Autowired
    private OrderService orderService;

    // 自动注入支付工具类
    @Autowired
    private PayUtil payUtil;

    /**
     * 测试方法，返回订单页面
     * @return 订单页面路径
     */
    @RequestMapping("/order")
    public String test() {
        return "order/order";
    }

    /**
     * 返回订单列表页面
     * @return 订单列表页面路径
     */
    @RequestMapping("/orderList")
    public String orderList() {
        return "/order/orderList";
    }

    /**
     * 发起支付宝支付请求
     * @param order_id 订单ID
     * @param response Http响应，用于返回支付页面
     * @throws AlipayApiException 支付宝API异常
     * @throws IOException 输入输出异常
     */
    @PostMapping("/pay/{order_id}")
    public void alipay(@PathVariable Integer order_id, HttpServletResponse response) throws AlipayApiException, IOException {
        // 根据订单ID获取订单信息
        Order order = orderService.getOrderById(order_id);

        if (order != null) {
            // 调用支付工具类发送请求到支付宝，获取支付页面的HTML
            String html = payUtil.sendRequestToAlipay(
                    String.valueOf(order.getOrder_id()),
                    order.getPrice().floatValue(),
                    "订单支付 - 订单号: " + order.getOrder_id()
            );

            // 设置响应的内容类型和字符编码
            response.setContentType("text/html;charset=UTF-8");

            // 将支付页面的HTML写入响应输出流
            response.getWriter().write(html);
            response.getWriter().flush();
        } else {
            // 如果订单不存在，返回404错误
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "订单不存在");
        }
    }

    /**
     * 支付宝异步通知处理方法
     * @param out_trade_no 支付宝交易号
     * @return 处理结果页面路径
     */
    @RequestMapping("/notify")
    public String success(String out_trade_no) {
        // 打印异步通知信息
        System.out.println("支付宝异步通知");
        System.out.println("订单号：" + out_trade_no);

        // 根据订单查询订单信息，更改订单状态
        //....其他业务逻辑

        // 最后支付宝要求返回success，这个不是success页面
        return "order/detail";
    }

    /**
     * 支付宝同步通知处理方法
     * @param out_trade_no 支付宝交易号
     * @return 处理结果页面路径
     * @throws ParseException 解析异常
     */
    @GetMapping("/return")
    public String returns(String out_trade_no) throws ParseException {
        // 打印同步通知信息
        System.out.println("同步通知");
        System.out.println("订单号：" + out_trade_no);

        // 调用支付工具类查询订单支付状态
        String query = payUtil.query(out_trade_no);
        System.out.println("==>" + query);

        // 解析查询结果为JSON对象
        JSONObject jsonObject = JSONObject.parseObject(query);
        Object o = jsonObject.get("alipay_trade_query_response");
        Map map = (Map) o;
        System.out.println(map);

        // 获取交易状态
        Object tradeStatus = map.get("trade_status");

        if (tradeStatus.equals("TRADE_SUCCESS")) {
            // 如果支付成功，打印信息并更新订单状态
            System.out.println("订单支付成功");
            System.out.println(tradeStatus);

            // 根据订单号获取订单信息
            Order order = orderService.getOrderById(Integer.parseInt(out_trade_no));

            if (order != null) {
                // 更新订单状态为已支付
                order.setStatus("PAID");
                orderService.createOrder(order); // 假设createOrder方法可以更新订单
            }

            return "orderList";
        } else {
            // 如果支付失败，打印信息并返回首页
            System.out.println("订单支付失败");
            return "index";
        }
    }
}